package smallfrench.moteur.biblio;

import java.util.HashMap;
import java.util.List;

import smallfrench.moteur.interp.RObjet;

public class RCreateurClasses extends AObjet {

	public static final AClasse CLASSE = AClasse.creer(RCreateurClasses.class);

	@AnnotationMembre
	public RCreateurClasses() {
	}

	@AnnotationMembre
	public AClasse creer(
			RChaine nom,
			ATableau superClasses,
			RFonctionScript constructeur,
			ATableau methodes,
			ATableau champsStatiques) {

		RClasse[] tc = new RClasse[superClasses.liste.size()];
		for (int i = 0; i < tc.length; i++) {
			tc[i] = (RClasse) superClasses.liste.get(i);
		}

		return new AClasse(
				nom.valeur,
				tc,
				constructeur,
				listeEnMapObj(methodes.liste),
				listeEnMapObj(champsStatiques.liste),
				false);

	}

	private static HashMap<String, RObjet> listeEnMapObj(List<?> liste) {

		if (liste.size() == 0 || (liste.size() % 2) != 0) return null;

		HashMap<String, RObjet> map = new HashMap<String, RObjet>();

		for (int i = 0; i < liste.size() / 2; i += 2) {

			Object o = liste.get(i);
			if (! (o instanceof RChaine)) return null;
			String nom = ((RChaine) o).valeur;

			o = liste.get(i + 1);
			map.put(nom, (RObjet) o);
		}

		return map;
	}
}
